home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume14 / jove4.9 / part11 < prev    next >
Encoding:
Internet Message Format  |  1988-04-26  |  50.1 KB

  1. Subject:  v14i067:  Jove, an emacs variant, version 4.9, Part11/21
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rsalz@uunet.UU.NET
  5.  
  6. Submitted-by: Jonathan Payne <jpayne@cs.rochester.edu>
  7. Posting-number: Volume 14, Issue 67
  8. Archive-name: jove4.9/part11
  9.  
  10. #! /bin/sh
  11. # This is a shell archive.  Remove anything before this line, then unpack
  12. # it by saving it into a file and typing "sh file".  To overwrite existing
  13. # files, type "sh file -c".  You can also feed this as standard input via
  14. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  15. # will see the following message at the end:
  16. #        "End of archive 11 (of 21)."
  17. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  18. if test -f './externs.h' -a "${1}" != "-c" ; then 
  19.   echo shar: Will not clobber existing file \"'./externs.h'\"
  20. else
  21. echo shar: Extracting \"'./externs.h'\" \(21599 characters\)
  22. sed "s/^X//" >'./externs.h' <<'END_OF_FILE'
  23. X/***************************************************************************
  24. X * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
  25. X * is provided to you without charge, and with no warranty.  You may give  *
  26. X * away copies of JOVE, including sources, provided that this notice is    *
  27. X * included in all the files.                                              *
  28. X ***************************************************************************/
  29. X
  30. X#ifdef TXT_TO_C
  31. X#define STDIO
  32. X#endif
  33. X#ifdef LINT_ARGS
  34. extern int
  35. X    abs(int);
  36. X
  37. extern void
  38. X    exit(int),
  39. X    _exit(int),
  40. X    *calloc(unsigned int, unsigned int),
  41. X#ifndef MAC
  42. X    free(void *),    /* returns an int on a Mac */
  43. X#endif
  44. X    *malloc(unsigned int),
  45. X    *realloc(void *, unsigned int);
  46. X
  47. extern char
  48. X    *getenv(char *),
  49. X    *tgoto(char *, int, int);
  50. X
  51. extern  char 
  52. X    **scanvec(char * *args,char *str),
  53. X    *IOerr(char *err,char *file),
  54. X    *MakeName(char *command),
  55. X    *StrIndex(int dir,char *buf,int charpos,char what),
  56. X    *ask(char *, char *, ...),
  57. X    *ask_buf(struct buffer *def),
  58. X    *ask_file(char *prmt,char *def,char *buf),
  59. X    *basename(char *f),
  60. X    *copystr(char *str),
  61. X    *do_ask(char *, int (*)(), char *, char *, ...),
  62. X    *emalloc(int size),
  63. X    *filename(struct buffer *b),
  64. X    *get_time(long *timep,char *buf,int from,int to),
  65. X    *getsearch(void),
  66. X    *itoa(int num),
  67. X    *lbptr(struct line *line),
  68. X    *lcontents(struct line *line),
  69. X    *ltobuf(struct line *line,char *buf),
  70. X    *pr_name(char *fname,int okay_home),
  71. X    *ralloc(char *obj,int size),
  72. X    *sprint(char *, ...),
  73. X    switchar(void);
  74. X
  75. extern  int 
  76. X    BufSwrite(int linenum),
  77. X    FLine(struct window *w),
  78. X    LineDist(struct line *nextp,struct line *endp),
  79. X    LookingAt(char *pattern,char *buf,int offset),
  80. X    ModBufs(int allp),
  81. X    ModMacs(void),
  82. X    Peekc(void),
  83. X    TwoBlank(void),
  84. X    UnixToBuf(char *,int ,int ,int , ...),
  85. X    addgetc(void),
  86. X    alphacomp(char * *a,char * *b),
  87. X    arg_type(void),
  88. X    arg_value(void),
  89. X    ask_int(char *prompt,int base),
  90. X    aux_complete(int c),
  91. X    blnkp(char *buf),
  92. X    calc_pos(char *lp,int c_char),
  93. X    casecmp(char *s1,char *s2),
  94. X    casencmp(char *s1,char *s2,int n),
  95. X    charp(void),
  96. X    chr_to_int(char *cp,int base,int allints, int *result),
  97. X    complete(char * *possible,char *prompt,int flags),
  98. X    do_if(char *cmd),
  99. X    dosputc(char c),
  100. X    f_getint(struct File *fp),
  101. X    f_gets(struct File *fp,char *buf,int max),
  102. X    f_match(char *file),
  103. X    filbuf(struct File *fp),
  104. X    find_pos(struct line *line,int c_char),
  105. X    fixorder(struct line * *line1,int *char1,struct line * *line2,int *char2),
  106. X    _flush(int c,struct File *fp),
  107. X    getch(void),
  108. X    getchar(void),
  109. X    getrawinchar(void),
  110. X    how_far(struct line *line,int col),
  111. X    i_blank(struct line *lp),
  112. X    i_bsblank(struct line *lp),
  113. X    in_window(struct window *windes,struct line *line),
  114. X    inlist(struct line *first,struct line *what),
  115. X    in_macro(void),
  116. X    inorder(struct line *nextp,int char1,struct line *endp,int char2),
  117. X    is_an_arg(void),
  118. X    ismword(int c),
  119. X    joverc(char *file),
  120. X    length(struct line *line),
  121. X    look_at(char *expr),
  122. X#ifdef IBMPC
  123. X    lower(char *c),
  124. X#endif
  125. X    mac_getc(void),
  126. X    match(char * *choices,char *what),
  127. X    max(int a,int b),
  128. X    min(int a,int b),
  129. X    numcomp(char *s1,char *s2),
  130. X    pnt_line(void),
  131. X    rawkey_ready(void),
  132. X    re_lindex(struct line *line,int offset,char *expr,char * *alts,int lbuf_okay),
  133. X    scandir(char *dir,char * * *nmptr,int (*qualify)(),int (*sorter)()),
  134. X    sindex(char *pattern,char *string),
  135. X    swrite(char *line,int inversep,int abortable),
  136. X    unbind_aux(int c),
  137. X    waitchar(int *slow),
  138. X    yes_or_no_p(char *, ...);
  139. X
  140. extern  disk_line 
  141. X    f_getputl(struct line *line,struct File *fp),
  142. X    putline(char *buf);
  143. X
  144. extern  struct File 
  145. X    *f_open(char *name,int flags,char *buffer,int buf_size),
  146. X    *fd_open(char *name,int flags,int fd,char *buffer,int bsize),
  147. X    *open_file(char *fname,char *buf,int how,int ifbad,int loudness);
  148. X
  149. extern  struct buffer 
  150. X    *buf_exists(char *name),
  151. X    *do_find(struct window *w,char *fname,int force),
  152. X    *do_select(struct window *w,char *name),
  153. X    *file_exists(char *name),
  154. X    *getNMbuf(void);
  155. X
  156. extern  struct cmd 
  157. X    *FindCmd(void (*proc)());
  158. extern  struct data_obj 
  159. X    **IsPrefix(struct data_obj *cp),
  160. X    *findcom(char *prompt),
  161. X    *findmac(char *prompt),
  162. X    *findvar(char *prompt);
  163. X
  164. extern  struct line 
  165. X    *lastline(struct line *lp),
  166. X    *listput(struct buffer *buf,struct line *after),
  167. X    *max_line(struct line *l1,struct line *l2),
  168. X    *min_line(struct line *l1,struct line *l2),
  169. X    *nbufline(void),
  170. X    *next_line(struct line *line,int num),
  171. X    *prev_line(struct line *line,int num),
  172. X    *reg_delete(struct line *line1,int char1,struct line *line2,int char2);
  173. X
  174. extern  struct m_thread 
  175. X    *alloc_mthread(void);
  176. X
  177. extern  struct mark 
  178. X    *CurMark(void),
  179. X    *MakeMark(struct line *line,int column,int type);
  180. X
  181. extern  struct position 
  182. X    *DoYank(struct line *fline,int fchar,struct line *tline,int tchar,struct line *atline,int atchar,struct buffer *whatbuf),
  183. X    *c_indent(int incrmt),
  184. X    *docompiled(int dir,char *expr,char * *alts),
  185. X    *dosearch(char *pattern,int dir,int re),
  186. X    *lisp_indent(void),
  187. X    *m_paren(char p_type,int dir,int can_mismatch,int can_stop);
  188. X
  189. extern  struct table 
  190. X    *make_table(void);
  191. X
  192. extern  struct window 
  193. X    *div_wind(struct window *wp,int n),
  194. X    *w_nam_typ(char *name,int type),
  195. X    *windbp(struct buffer *bp);
  196. X
  197. extern  struct word 
  198. X    *word_in_table(char *text,struct table *table);
  199. X
  200. extern  unsigned char 
  201. X    chpl(void),
  202. X    lpp(void);
  203. X
  204. extern  void 
  205. X    AbbrevExpand(void),
  206. X    AddSpecial(void),
  207. X    AllMarkSet(struct buffer *b,struct line *line,int col),
  208. X    AppReg(void),
  209. X    Apropos(void),
  210. X    BList(void),
  211. X    BSexpr(void),
  212. X    BUpList(void),
  213. X    BackChar(void),
  214. X    BackPara(void),
  215. X    BackWord(void),
  216. X    BindAKey(void),
  217. X    BindMac(void),
  218. X    BindMtoW(void),
  219. X    BindSomething(struct data_obj *(*proc)()),
  220. X    BindWMap(struct data_obj * *map,int lastkey,struct data_obj *cmd),
  221. X    Bof(void),
  222. X    Bol(void),
  223. X    Bos(void),
  224. X    Bow(void),
  225. X    Buf10Select(void),
  226. X    Buf1Select(void),
  227. X    Buf2Select(void),
  228. X    Buf3Select(void),
  229. X    Buf4Select(void),
  230. X    Buf5Select(void),
  231. X    Buf6Select(void),
  232. X    Buf7Select(void),
  233. X    Buf8Select(void),
  234. X    Buf9Select(void),
  235. X    BufErase(void),
  236. X    BufKill(void),
  237. X    BufList(void),
  238. X    BufPos(void),
  239. X    BufSelect(void),
  240. X    CAutoExec(void),
  241. X    CalcWind(struct window *w),
  242. X    CapChar(void),
  243. X    CapWord(void),
  244. X    CasRegLower(void),
  245. X    CasRegUpper(void),
  246. X    CaseReg(int up),
  247. X    CentWind(struct window *w),
  248. X    ChkWindows(struct line *line1,struct line *line2),
  249. X    ChrToOct(void),
  250. X    ClAndRedraw(void),
  251. X    Comment(void),
  252. X    CopyRegion(void),
  253. X    CtlxPrefix(void),
  254. X    DFixMarks(struct line *line1,int char1,struct line *line2,int char2),
  255. X    DOTsave(struct position *buf),
  256. X    DefAutoExec(struct data_obj *(*proc)()),
  257. X    DefGAbbrev(void),
  258. X    DefKBDMac(void),
  259. X    DefMAbbrev(void),
  260. X    DelBlnkLines(void),
  261. X    DelCurWindow(void),
  262. X    DelMacro(void),
  263. X    DelMark(struct mark *m),
  264. X    DelNChar(void),
  265. X    DelNWord(void),
  266. X    DelPChar(void),
  267. X    DelPWord(void),
  268. X    DelReg(void),
  269. X    DelWtSpace(void),
  270. X    DescBindings(void),
  271. X    DescCom(void),
  272. X    DescMap(struct data_obj * *map,char *pref),
  273. X    DescWMap(struct data_obj * *map,int key),
  274. X    Digit(void),
  275. X    Digit0(void),
  276. X    Digit1(void),
  277. X    Digit2(void),
  278. X    Digit3(void),
  279. X    Digit4(void),
  280. X    Digit5(void),
  281. X    Digit6(void),
  282. X    Digit7(void),
  283. X    Digit8(void),
  284. X    Digit9(void),
  285. X    DoAutoExec(char *new,char *old),
  286. X    DoJustify(struct line *l1,int c1,struct line *l2,int c2,int scrunch,int indent),
  287. X    DoKeys(int nocmdline),
  288. X    DoNewline(int indentp),
  289. X    DoPara(int dir),
  290. X    DoParen(void),
  291. X    DoWriteReg(int app),
  292. X    DotTo(struct line *line,int col),
  293. X    DownScroll(void),
  294. X    DrawMesg(int abortable),
  295. X    EditAbbrevs(void),
  296. X    Eof(void),
  297. X    Eol(void),
  298. X    Eos(void),
  299. X    Eow(void),
  300. X    ErrFree(void),
  301. X    ErrParse(void),
  302. X    EscPrefix(void),
  303. X    ExecCmd(struct data_obj *cp),
  304. X    ExecMacro(void),
  305. X    Extend(void),
  306. X    FDotTag(void),
  307. X    FDownList(void),
  308. X    FList(void),
  309. X    FSexpr(void),
  310. X    FSrchND(void),
  311. X    FillComment(char *format),
  312. X    FilterRegion(void),
  313. X    FindFile(void),
  314. X    FindTag(void),
  315. X    ForChar(void),
  316. X    ForPara(void),
  317. X    ForSearch(void),
  318. X    ForWord(void),
  319. X    Forget(void),
  320. X    GCchunks(void),
  321. X    GSexpr(void),
  322. X    GoLine(void),
  323. X    GotoWind(void),
  324. X    GrowWindow(void),
  325. X    HandlePref(struct data_obj * *map),
  326. X    IFixMarks(struct line *line1,int char1,struct line *line2,int char2),
  327. X    IncFSearch(void),
  328. X    IncRSearch(void),
  329. X    InitCM(void),
  330. X    InsFile(void),
  331. X    Insert(int c),
  332. X    Justify(void),
  333. X    KeyDesc(void),
  334. X    KillBos(void),
  335. X    KillEOL(void),
  336. X    KillEos(void),
  337. X    KillExpr(void),
  338. X    KillSome(void),
  339. X    Leave(void),
  340. X    LineAI(void),
  341. X    LineInsert(int num),
  342. X    LowWord(void),
  343. X    MAutoExec(void),
  344. X    MacInter(void),
  345. X    MakeErrors(void),
  346. X    MarkSet(struct mark *m,struct line *line,int column),
  347. X    MiscPrefix(void),
  348. X    NameMac(void),
  349. X    Newline(void),
  350. X    NextError(void),
  351. X    NextLine(void),
  352. X    NextPage(void),
  353. X    NextWindow(void),
  354. X    NotModified(void),
  355. X    OneWindow(void),
  356. X    OpenLine(void),
  357. X    PageNWind(void),
  358. X    PageScrollDown(void),
  359. X    PageScrollUp(void),
  360. X    ParseAll(void),
  361. X    PathParse(char *name,char *intobuf),
  362. X    Placur(int line,int col),
  363. X    PopMark(void),
  364. X    PrVar(void),
  365. X    PrevError(void),
  366. X    PrevLine(void),
  367. X    PrevPage(void),
  368. X    PrevWindow(void),
  369. X    PtToMark(void),
  370. X    Push(void),
  371. X    PushPntp(struct line *line),
  372. X    QRepSearch(void),
  373. X    QuotChar(void),
  374. X    REcompile(char *pattern,int re,char *into_buf,char * *alt_bufp),
  375. X    RErecur(void),
  376. X    RSrchND(void),
  377. X    ReNamBuf(void),
  378. X    ReadFile(void),
  379. X    Recur(void),
  380. X    RedrawDisplay(void),
  381. X    RegJustify(void),
  382. X    RegReplace(void),
  383. X    RegToUnix(struct buffer *outbuf,char *cmd),
  384. X    Remember(void),
  385. X    RepSearch(void),
  386. X    ResetTerm(void),
  387. X    RestAbbrevs(void),
  388. X    RevSearch(void),
  389. X    RunMacro(void),
  390. X    SO_off(void),
  391. X    SO_on(void),
  392. X    SaveAbbrevs(void),
  393. X    SaveFile(void),
  394. X    SelfInsert(void),
  395. X    SetABuf(struct buffer *b),
  396. X    SetBuf(struct buffer *newbuf),
  397. X    SetDot(struct position *bp),
  398. X    SetLMargin(void),
  399. X    SetMark(void),
  400. X    SetRMargin(void),
  401. X    SetTop(struct window *w,struct line *line),
  402. X    SetVar(void),
  403. X    SetWind(struct window *new),
  404. X    ShToBuf(void),
  405. X    ShellCom(void),
  406. X    ShowErr(void),
  407. X    ShowVersion(void),
  408. X    ShrWindow(void),
  409. X    SitFor(unsigned int delay),
  410. X    Source(void),
  411. X    SplitWind(void),
  412. X    StrLength(void),
  413. X    SyncTmp(void),
  414. X    TOstart(char *name,int auto_newline),
  415. X    TOstop(void),
  416. X    Tab(void),
  417. X    TimesFour(void),
  418. X    ToError(int forward),
  419. X    ToFirst(void),
  420. X    ToIndent(void),
  421. X    ToLast(void),
  422. X    ToMark(struct mark *m),
  423. X    TogMinor(int bit),
  424. X    TransChar(void),
  425. X    TransLines(void),
  426. X    Typeout(char *, ...),
  427. X    UNIX_cmdline(int argc,char * *argv),
  428. X    UnbindC(void),
  429. X    Ungetc(int c),
  430. X    UnsetTerm(char *),
  431. X    UpScroll(void),
  432. X    UppWord(void),
  433. X    WNumLines(void),
  434. X    WVisSpace(void),
  435. X    WindFind(void),
  436. X    WindSize(struct window *w,int inc),
  437. X    WriteFile(void),
  438. X    WriteMacs(void),
  439. X    WrtReg(void),
  440. X    WtModBuf(void),
  441. X    XParse(void),
  442. X    Yank(void),
  443. X    YankPop(void),
  444. X    add_mess(char *, ...),
  445. X    add_stroke(int c),
  446. X    add_word(char *wname,struct table *table),
  447. X    b_char(int n),
  448. X    b_word(int num),
  449. X    bufname(struct buffer *b),
  450. X    case_reg(struct line *line1,int char1,struct line *line2,int char2,int up),
  451. X    case_word(int up),
  452. X    cl_eol(void),
  453. X    cl_scr(int doit),
  454. X    close_file(struct File *fp),
  455. X    clr_arg_value(void),
  456. X    clrline(char *cp1,char *cp2),
  457. X    complain(char *, ...),
  458. X    confirm(char *, ...),
  459. X    d_cache_init(void),
  460. X    del_char(int dir,int num),
  461. X    del_wind(struct window *wp),
  462. X    dispatch(int c),
  463. X    do_macro(struct macro *mac),
  464. X    do_rfill(int ulm),
  465. X    do_set_mark(struct line *l,int c),
  466. X    do_sgtty(void),
  467. X    do_space(void),
  468. X    dobell(int x),
  469. X    dofread(struct File *fp),
  470. X    dword(int forward),
  471. X    error(char *, ...),
  472. X    f_char(int n),
  473. X    f_close(struct File *fp),
  474. X    f_mess(char *, ...),
  475. X    f_readn(struct File *fp,char *addr,int n),
  476. X    f_seek(struct File *fp,long offset),
  477. X    f_toNL(struct File *fp),
  478. X    f_word(int num),
  479. X    file_backup(char *fname),
  480. X    file_write(char *fname,int app),
  481. X    filemunge(char *newname),
  482. X    find_para(int how),
  483. X    find_tag(char *tag,int localp),
  484. X    finish(int code),
  485. X    flush(struct File *fp),
  486. X    flusho(void),
  487. X    format(char *buf,int len,char *fmt,char *ap),
  488. X#ifndef STDIO
  489. X    fprintf(struct File *,char *, ...),
  490. X#endif
  491. X    fputnchar(char *s,int n,struct File *fp),
  492. X    free_mthread(struct m_thread *t),
  493. X    freedir(char * * *nmptr,int nentries),
  494. X    freeline(struct line *line),
  495. X    gc_openfiles(void),
  496. X    getTERM(void),
  497. X    getline(disk_line addr,char *buf),
  498. X    i_set(int nline,int ncol),
  499. X    init_43(void),
  500. X    init_strokes(void),
  501. X    init_term(void),
  502. X    initlist(struct buffer *b),
  503. X    ins_c(char c,char *buf,int atchar,int num,int max),
  504. X    ins_str(char *str,int ok_nl),
  505. X    insert_c(int c,int n),
  506. X    isprocbuf(char *bufname),
  507. X    len_error(int flag),
  508. X    lfreelist(struct line *first),
  509. X    lfreereg(struct line *line1,struct line *line2),
  510. X    line_move(int dir,int n,int line_cmd),
  511. X    linecopy(char *onto,int atchar,char *from),
  512. X    lremove(struct line *line1,struct line *line2),
  513. X    lsave(void),
  514. X    mac_init(void),
  515. X    mac_putc(int c),
  516. X#ifndef MAC
  517. X    main(int argc,char * *argv),
  518. X#endif
  519. X    make_argv(char * *argv,char *ap),
  520. X    make_scr(void),
  521. X    message(char *str),
  522. X    minib_add(char *str,int movedown),
  523. X    modify(void),
  524. X    mp_error(void),
  525. X    n_indent(int goal),
  526. X    negate_arg_value(void),
  527. X    null_ncpy(char *to,char *from,int n),
  528. X    open_lines(int n),
  529. X    patchup(struct line *line1,int char1,struct line *line2,int char2),
  530. X    pop_env(jmp_buf),
  531. X    pop_wind(char *name,int clobber,int btype),
  532. X    prCTIME(void),
  533. X    pr_putc(int c,struct File *fp),
  534. X#ifndef STDIO
  535. X    printf(char *, ...),
  536. X#endif
  537. X    push_env(jmp_buf),
  538. X    put_bufs(int askp),
  539. X    putmatch(int which,char *buf,int size),
  540. X    putpad(char *str,int lines),
  541. X    putreg(struct File *fp,struct line *line1,int char1,struct line *line2,int char2,int makesure),
  542. X    putstr(char *s),
  543. X    rbell(void),
  544. X    re_dosub(char *tobuf,int delp),
  545. X    read_file(char *file,int is_insert),
  546. X    redisplay(void),
  547. X    reg_kill(struct line *line2,int char2,int dot_moved),
  548. X    reset_43(void),
  549. X    s_mess(char *, ...),
  550. X    set_arg_value(int n),
  551. X    set_ino(struct buffer *b),
  552. X    set_is_an_arg(int there_is),
  553. X    set_mark(void),
  554. X    set_wsize(int wsize),
  555. X    setbname(struct buffer *b,char *name),
  556. X    setcolor(unsigned char fg,unsigned char bg),
  557. X    setfname(struct buffer *b,char *name),
  558. X    setsearch(char *str),
  559. X    settout(char *ttbuf),
  560. X    slowpoke(void),
  561. X#ifndef STDIO
  562. X    sprintf(char *,char *, ...),
  563. X#endif
  564. X    tiewind(struct window *w,struct buffer *bp),
  565. X    tmpclose(void),
  566. X    tmpinit(void),
  567. X    to_word(int dir),
  568. X    ttinit(void),
  569. X    ttsize(void),
  570. X    tty_reset(void),
  571. X    ttyset(int n),
  572. X    unmodify(void),
  573. X    unwind_macro_stack(void),
  574. X    updmode(void),
  575. X    v_clear(int line1,int line2),
  576. X    v_del_line(int num,int top,int bottom),
  577. X    v_ins_line(int num,int top,int bottom),
  578. X    winit(void),
  579. X    write_em(char *s),
  580. X    write_emc(char *s,int n),
  581. X    write_emif(),
  582. X    write_emif(char *s);
  583. X
  584. X#ifdef MAC
  585. X
  586. extern int
  587. X    creat(char *,int),
  588. X    open(char *,int),
  589. X    close(int),
  590. X    read(int,char *,unsigned),
  591. X    write(int,char *,unsigned),
  592. X    free(char *);
  593. X    unlink(char *),
  594. X    chdir(char *),
  595. X    rawchkc(void),
  596. X    getArgs(char ***);
  597. X    
  598. X    
  599. extern long 
  600. X    lseek(int,long,unsigned);
  601. X
  602. extern char 
  603. X    *pwd(void),
  604. X    *index(char *,char),
  605. X    *mktemp(char *),
  606. X    *rindex(char *,char),
  607. X    *getwd(void),
  608. X    *pfile(char *),
  609. X    *gfile(char *);
  610. X    
  611. extern void
  612. X    MacInit(void),
  613. X    InitBinds(void),
  614. X    NPlacur(int,int),
  615. X    i_lines(int,int,int),
  616. X    d_lines(int,int,int),
  617. X    clr_page(void),
  618. X    clr_eoln(void),
  619. X    docontrols(void),
  620. X    RemoveScrollBar(Window *),
  621. X    InitEvents(void),
  622. X    menus_on(void),
  623. X    menus_off(void);
  624. X
  625. X#endif /* MAC */
  626. X
  627. X#else
  628. X
  629. extern time_t
  630. X    time();
  631. X
  632. extern long    
  633. X    lseek();
  634. X
  635. extern int
  636. X    abs(),
  637. X    read(),
  638. X    write();
  639. X
  640. extern void
  641. X    exit(),
  642. X    _exit(),
  643. X    free();
  644. X
  645. extern char
  646. X    *getenv(),
  647. X    *pwd(),
  648. X    *index(),
  649. X    *malloc(),
  650. X    *mktemp(),
  651. X    *realloc(),
  652. X    *rindex(),
  653. X#ifdef IPROCS
  654. X    *pstate(),
  655. X#endif
  656. X    *tgoto();
  657. X
  658. extern  char 
  659. X    **scanvec(),
  660. X    *IOerr(),
  661. X    *MakeName(),
  662. X    *StrIndex(),
  663. X    *ask(),
  664. X    *ask_buf(),
  665. X    *ask_file(),
  666. X    *basename(),
  667. X    *copystr(),
  668. X    *do_ask(),
  669. X    *emalloc(),
  670. X    *filename(),
  671. X    *get_time(),
  672. X    *getsearch(),
  673. X    *itoa(),
  674. X    *lbptr(),
  675. X    *lcontents(),
  676. X    *ltobuf(),
  677. X    *pr_name(),
  678. X    *ralloc(),
  679. X    *sprint(),
  680. X    switchar();
  681. X
  682. extern  int 
  683. X    BufSwrite(),
  684. X    FLine(),
  685. X    LineDist(),
  686. X    LookingAt(),
  687. X    ModBufs(),
  688. X    ModMacs(),
  689. X    Peekc(),
  690. X    TwoBlank(),
  691. X    UnixToBuf(),
  692. X    addgetc(),
  693. X    alphacomp(),
  694. X    arg_type(),
  695. X    arg_value(),
  696. X    ask_int(),
  697. X    aux_complete(),
  698. X    blnkp(),
  699. X    calc_pos(),
  700. X    casecmp(),
  701. X    casencmp(),
  702. X    charp(),
  703. X    chr_to_int(),
  704. X    complete(),
  705. X    do_if(),
  706. X    dosputc(),
  707. X    f_getint(),
  708. X    f_gets(),
  709. X    f_match(),
  710. X    filbuf(),
  711. X    find_pos(),
  712. X    fixorder(),
  713. X    _flush(),
  714. X    getch(),
  715. X    getchar(),
  716. X    getrawinchar(),
  717. X    how_far(),
  718. X    i_blank(),
  719. X    i_bsblank(),
  720. X    in_window(),
  721. X    inlist(),
  722. X    in_macro(),
  723. X    inorder(),
  724. X    is_an_arg(),
  725. X    ismword(),
  726. X    joverc(),
  727. X    length(),
  728. X    look_at(),
  729. X#ifdef IBMPC
  730. X    lower(),
  731. X#endif    
  732. X    mac_getc(),
  733. X    match(),
  734. X    max(),
  735. X    min(),
  736. X    numcomp(),
  737. X    pnt_line(),
  738. X    rawkey_ready(),
  739. X    re_lindex(),
  740. X    scandir(),
  741. X    sindex(),
  742. X    swrite(),
  743. X    unbind_aux(),
  744. X    waitchar(),
  745. X    yes_or_no_p();
  746. X
  747. extern  disk_line 
  748. X    f_getputl(),
  749. X    putline();
  750. X
  751. extern  struct File 
  752. X    *f_open(),
  753. X    *fd_open(),
  754. X    *open_file();
  755. X
  756. extern  struct buffer 
  757. X    *buf_exists(),
  758. X    *do_find(),
  759. X    *do_select(),
  760. X    *file_exists(),
  761. X    *getNMbuf();
  762. X
  763. extern  struct cmd 
  764. X    *FindCmd();
  765. X
  766. extern  struct data_obj 
  767. X    **IsPrefix(),
  768. X    *findcom(),
  769. X    *findmac(),
  770. X    *findvar();
  771. X
  772. extern  struct line 
  773. X    *lastline(),
  774. X    *listput(),
  775. X    *max_line(),
  776. X    *min_line(),
  777. X    *nbufline(),
  778. X    *next_line(),
  779. X    *prev_line(),
  780. X    *reg_delete();
  781. X
  782. extern  struct m_thread 
  783. X    *alloc_mthread();
  784. X
  785. extern  struct mark 
  786. X    *CurMark(),
  787. X    *MakeMark();
  788. X
  789. extern  struct position 
  790. X    *DoYank(),
  791. X    *c_indent(),
  792. X    *docompiled(),
  793. X    *dosearch(),
  794. X    *lisp_indent(),
  795. X    *m_paren();
  796. X
  797. extern  struct table 
  798. X    *make_table();
  799. X
  800. extern  struct window 
  801. X    *div_wind(),
  802. X    *w_nam_typ(),
  803. X    *windbp();
  804. X
  805. extern  struct word 
  806. X    *word_in_table();
  807. X
  808. extern  unsigned char 
  809. X    chpl(),
  810. X    lpp();
  811. X
  812. extern  void 
  813. X    AbbrevExpand(),
  814. X    AddSpecial(),
  815. X    AllMarkSet(),
  816. X    AppReg(),
  817. X    Apropos(),
  818. X    BList(),
  819. X    BSexpr(),
  820. X    BUpList(),
  821. X    BackChar(),
  822. X    BackPara(),
  823. X    BackWord(),
  824. X    BindAKey(),
  825. X    BindMac(),
  826. X    BindMtoW(),
  827. X    BindSomething(),
  828. X    BindWMap(),
  829. X    Bof(),
  830. X    Bol(),
  831. X    Bos(),
  832. X    Bow(),
  833. X    Buf10Select(),
  834. X    Buf1Select(),
  835. X    Buf2Select(),
  836. X    Buf3Select(),
  837. X    Buf4Select(),
  838. X    Buf5Select(),
  839. X    Buf6Select(),
  840. X    Buf7Select(),
  841. X    Buf8Select(),
  842. X    Buf9Select(),
  843. X    BufErase(),
  844. X    BufKill(),
  845. X    BufList(),
  846. X    BufPos(),
  847. X    BufSelect(),
  848. X    CAutoExec(),
  849. X    CalcWind(),
  850. X    CapChar(),
  851. X    CapWord(),
  852. X    CasRegLower(),
  853. X    CasRegUpper(),
  854. X    CaseReg(),
  855. X    CentWind(),
  856. X    ChkWindows(),
  857. X    ChrToOct(),
  858. X    ClAndRedraw(),
  859. X    Comment(),
  860. X    CopyRegion(),
  861. X    CtlxPrefix(),
  862. X    DFixMarks(),
  863. X    DOTsave(),
  864. X    DefAutoExec(),
  865. X    DefGAbbrev(),
  866. X    DefKBDMac(),
  867. X    DefMAbbrev(),
  868. X    DelBlnkLines(),
  869. X    DelCurWindow(),
  870. X    DelMacro(),
  871. X    DelMark(),
  872. X    DelNChar(),
  873. X    DelNWord(),
  874. X    DelPChar(),
  875. X    DelPWord(),
  876. X    DelReg(),
  877. X    DelWtSpace(),
  878. X    DescBindings(),
  879. X    DescCom(),
  880. X    DescMap(),
  881. X    DescWMap(),
  882. X    Digit(),
  883. X    Digit0(),
  884. X    Digit1(),
  885. X    Digit2(),
  886. X    Digit3(),
  887. X    Digit4(),
  888. X    Digit5(),
  889. X    Digit6(),
  890. X    Digit7(),
  891. X    Digit8(),
  892. X    Digit9(),
  893. X    DoAutoExec(),
  894. X    DoJustify(),
  895. X    DoKeys(),
  896. X    DoNewline(),
  897. X    DoPara(),
  898. X    DoParen(),
  899. X    DoWriteReg(),
  900. X    DotTo(),
  901. X    DownScroll(),
  902. X    DrawMesg(),
  903. X    EditAbbrevs(),
  904. X    Eof(),
  905. X    Eol(),
  906. X    Eos(),
  907. X    Eow(),
  908. X    ErrFree(),
  909. X    ErrParse(),
  910. X    EscPrefix(),
  911. X    ExecCmd(),
  912. X    ExecMacro(),
  913. X    Extend(),
  914. X    FDotTag(),
  915. X    FDownList(),
  916. X    FList(),
  917. X    FSexpr(),
  918. X    FSrchND(),
  919. X    FillComment(),
  920. X    FilterRegion(),
  921. X    FindFile(),
  922. X    FindTag(),
  923. X    ForChar(),
  924. X    ForPara(),
  925. X    ForSearch(),
  926. X    ForWord(),
  927. X    Forget(),
  928. X    GCchunks(),
  929. X    GSexpr(),
  930. X    GoLine(),
  931. X    GotoWind(),
  932. X    GrowWindow(),
  933. X    HandlePref(),
  934. X    IFixMarks(),
  935. X    IncFSearch(),
  936. X    IncRSearch(),
  937. X    InitCM(),
  938. X    InsFile(),
  939. X    Insert(),
  940. X    Justify(),
  941. X    KeyDesc(),
  942. X    KillBos(),
  943. X    KillEOL(),
  944. X    KillEos(),
  945. X    KillExpr(),
  946. X    KillSome(),
  947. X    Leave(),
  948. X    LineAI(),
  949. X    LineInsert(),
  950. X    LowWord(),
  951. X    MAutoExec(),
  952. X    MacInter(),
  953. X    MakeErrors(),
  954. X    MarkSet(),
  955. X    MiscPrefix(),
  956. X    NameMac(),
  957. X    Newline(),
  958. X    NextError(),
  959. X    NextLine(),
  960. X    NextPage(),
  961. X    NextWindow(),
  962. X    NotModified(),
  963. X    OneWindow(),
  964. X    OpenLine(),
  965. X    PageNWind(),
  966. X    PageScrollDown(),
  967. X    PageScrollUp(),
  968. X    ParseAll(),
  969. X    PathParse(),
  970. X    Placur(),
  971. X    PopMark(),
  972. X    PrVar(),
  973. X    PrevError(),
  974. X    PrevLine(),
  975. X    PrevPage(),
  976. X    PrevWindow(),
  977. X    PtToMark(),
  978. X    Push(),
  979. X    PushPntp(),
  980. X    QRepSearch(),
  981. X    QuotChar(),
  982. X    REcompile(),
  983. X    RErecur(),
  984. X    RSrchND(),
  985. X    ReNamBuf(),
  986. X    ReadFile(),
  987. X    Recur(),
  988. X    RedrawDisplay(),
  989. X    RegJustify(),
  990. X    RegReplace(),
  991. X    RegToUnix(),
  992. X    Remember(),
  993. X    RepSearch(),
  994. X    ResetTerm(),
  995. X    RestAbbrevs(),
  996. X    RevSearch(),
  997. X    RunMacro(),
  998. X    SO_off(),
  999. X    SO_on(),
  1000. X    SaveAbbrevs(),
  1001. X    SaveFile(),
  1002. X    SelfInsert(),
  1003. X    SetABuf(),
  1004. X    SetBuf(),
  1005. X    SetDot(),
  1006. X    SetLMargin(),
  1007. X    SetMark(),
  1008. X    SetRMargin(),
  1009. X    SetTop(),
  1010. X    SetVar(),
  1011. X    SetWind(),
  1012. X    ShToBuf(),
  1013. X    ShellCom(),
  1014. X    ShowErr(),
  1015. X    ShowVersion(),
  1016. X    ShrWindow(),
  1017. X    SitFor(),
  1018. X    Source(),
  1019. X    SplitWind(),
  1020. X    StrLength(),
  1021. X    SyncTmp(),
  1022. X    TOstart(),
  1023. X    TOstop(),
  1024. X    Tab(),
  1025. X    TimesFour(),
  1026. X    ToError(),
  1027. X    ToFirst(),
  1028. X    ToIndent(),
  1029. X    ToLast(),
  1030. X    ToMark(),
  1031. X    TogMinor(),
  1032. X    TransChar(),
  1033. X    TransLines(),
  1034. X    Typeout(),
  1035. X    UNIX_cmdline(),
  1036. X    UnbindC(),
  1037. X    Ungetc(),
  1038. X    UnsetTerm(),
  1039. X    UpScroll(),
  1040. X    UppWord(),
  1041. X    WNumLines(),
  1042. X    WVisSpace(),
  1043. X    WindFind(),
  1044. X    WindSize(),
  1045. X    WriteFile(),
  1046. X    WriteMacs(),
  1047. X    WrtReg(),
  1048. X    WtModBuf(),
  1049. X    XParse(),
  1050. X    Yank(),
  1051. X    YankPop(),
  1052. X    add_mess(),
  1053. X    add_stroke(),
  1054. X    add_word(),
  1055. X    b_char(),
  1056. X    b_word(),
  1057. X    bufname(),
  1058. X    case_reg(),
  1059. X    case_word(),
  1060. X    cl_eol(),
  1061. X    cl_scr(),
  1062. X    close_file(),
  1063. X    clr_arg_value(),
  1064. X    clrline(),
  1065. X    complain(),
  1066. X    confirm(),
  1067. X    d_cache_init(),
  1068. X    del_char(),
  1069. X    del_wind(),
  1070. X    dispatch(),
  1071. X    do_macro(),
  1072. X    do_rfill(),
  1073. X    do_set_mark(),
  1074. X    do_sgtty(),
  1075. X    do_space(),
  1076. X    dobell(),
  1077. X    dofread(),
  1078. X    dword(),
  1079. X    error(),
  1080. X    f_char(),
  1081. X    f_close(),
  1082. X    f_mess(),
  1083. X    f_readn(),
  1084. X    f_seek(),
  1085. X    f_toNL(),
  1086. X    f_word(),
  1087. X    file_backup(),
  1088. X    file_write(),
  1089. X    filemunge(),
  1090. X    find_para(),
  1091. X    find_tag(),
  1092. X    finish(),
  1093. X    flush(),
  1094. X    flusho(),
  1095. X    format(),
  1096. X#ifndef STDIO
  1097. X    fprintf(),
  1098. X#endif    
  1099. X    fputnchar(),
  1100. X    free_mthread(),
  1101. X    freedir(),
  1102. X    freeline(),
  1103. X    gc_openfiles(),
  1104. X    getTERM(),
  1105. X    getline(),
  1106. X    i_set(),
  1107. X    init_43(),
  1108. X    init_strokes(),
  1109. X    init_term(),
  1110. X    initlist(),
  1111. X    ins_c(),
  1112. X    ins_str(),
  1113. X    insert_c(),
  1114. X    isprocbuf(),
  1115. X    len_error(),
  1116. X    lfreelist(),
  1117. X    lfreereg(),
  1118. X    line_move(),
  1119. X    linecopy(),
  1120. X    lremove(),
  1121. X    lsave(),
  1122. X    mac_init(),
  1123. X    mac_putc(),
  1124. X    main(),
  1125. X    make_argv(),
  1126. X    make_scr(),
  1127. X    message(),
  1128. X    minib_add(),
  1129. X    modify(),
  1130. X    mp_error(),
  1131. X    n_indent(),
  1132. X    negate_arg_value(),
  1133. X    null_ncpy(),
  1134. X    open_lines(),
  1135. X    patchup(),
  1136. X    pop_env(),
  1137. X    pop_wind(),
  1138. X    prCTIME(),
  1139. X    pr_putc(),
  1140. X#ifndef STDIO
  1141. X    printf(),
  1142. X#endif    
  1143. X    push_env(),
  1144. X    put_bufs(),
  1145. X    putmatch(),
  1146. X    putpad(),
  1147. X    putreg(),
  1148. X    putstr(),
  1149. X    rbell(),
  1150. X    re_dosub(),
  1151. X    read_file(),
  1152. X    redisplay(),
  1153. X    reg_kill(),
  1154. X    reset_43(),
  1155. X    s_mess(),
  1156. X    set_arg_value(),
  1157. X    set_ino(),
  1158. X    set_is_an_arg(),
  1159. X    set_mark(),
  1160. X    set_wsize(),
  1161. X    setbname(),
  1162. X    setcolor(),
  1163. X    setfname(),
  1164. X    setsearch(),
  1165. X    settout(),
  1166. X    slowpoke(),
  1167. X#ifndef STDIO
  1168. X    sprintf(),
  1169. X#endif    
  1170. X    tiewind(),
  1171. X    tmpclose(),
  1172. X    tmpinit(),
  1173. X    to_word(),
  1174. X    ttinit(),
  1175. X    ttsize(),
  1176. X    tty_reset(),
  1177. X    ttyset(),
  1178. X    unmodify(),
  1179. X    unwind_macro_stack(),
  1180. X    updmode(),
  1181. X    v_clear(),
  1182. X    v_del_line(),
  1183. X    v_ins_line(),
  1184. X    winit(),
  1185. X    write_em(),
  1186. X    write_emc(),
  1187. X    write_emif(),
  1188. X    write_emif();
  1189. X#endif
  1190. END_OF_FILE
  1191. if test 21599 -ne `wc -c <'./externs.h'`; then
  1192.     echo shar: \"'./externs.h'\" unpacked with wrong size!
  1193. fi
  1194. # end of './externs.h'
  1195. fi
  1196. if test -f './jove.c' -a "${1}" != "-c" ; then 
  1197.   echo shar: Will not clobber existing file \"'./jove.c'\"
  1198. else
  1199. echo shar: Extracting \"'./jove.c'\" \(25416 characters\)
  1200. sed "s/^X//" >'./jove.c' <<'END_OF_FILE'
  1201. X/***************************************************************************
  1202. X * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
  1203. X * is provided to you without charge, and with no warranty.  You may give  *
  1204. X * away copies of JOVE, including sources, provided that this notice is    *
  1205. X * included in all the files.                                              *
  1206. X ***************************************************************************/
  1207. X
  1208. X/* Contains the main loop initializations, and some system dependent
  1209. X   type things, e.g. putting terminal in CBREAK mode, etc. */
  1210. X
  1211. X#include "jove.h"
  1212. X#include "io.h"
  1213. X#include "termcap.h"
  1214. X
  1215. X#ifdef MAC
  1216. X#    include "mac.h"
  1217. X#else
  1218. X#    include <varargs.h>
  1219. X#    include <sys/stat.h>
  1220. X#endif
  1221. X
  1222. X#include <signal.h>
  1223. X#include <errno.h>
  1224. X
  1225. X#ifdef UNIX
  1226. X#    ifndef SYSV
  1227. X#        include <sgtty.h>
  1228. X#    else
  1229. X#        include <termio.h>
  1230. X#    endif /* SYSV */
  1231. X#endif /* UNIX */
  1232. X
  1233. X#ifdef MSDOS
  1234. X#    include <process.h>
  1235. X#endif /* MSDOS */
  1236. X
  1237. X#ifndef MAC
  1238. X#    include <fcntl.h>
  1239. X#endif
  1240. X
  1241. X#ifdef MAC
  1242. X#    undef private
  1243. X#    define private
  1244. X#endif
  1245. X
  1246. X#ifdef    LINT_ARGS
  1247. extern    long    time(long *);
  1248. private    void    break_off(void);
  1249. private    void    break_rst(void);
  1250. X#else
  1251. extern    long    time();
  1252. private    void    break_off();
  1253. private    void    break_rst();
  1254. X#endif
  1255. X
  1256. X#ifdef MAC
  1257. X#    undef private
  1258. X#    define private static
  1259. X#endif
  1260. X
  1261. X#ifdef UNIX
  1262. X#ifdef TIOCSLTC
  1263. struct ltchars    ls1,
  1264. X        ls2;
  1265. X#endif /* TIOCSLTC */
  1266. X
  1267. X#ifdef TIOCGETC
  1268. struct tchars    tc1,
  1269. X        tc2;
  1270. X#endif
  1271. X
  1272. X#ifdef PASS8            /* use pass8 instead of raw for meta-key */
  1273. int    lm_word1,        /* local mode word */
  1274. X    lm_word2;
  1275. X#endif
  1276. X
  1277. X#ifdef BRLUNIX
  1278. struct sg_brl    sg1, sg2;
  1279. X#else
  1280. X#ifdef SYSV
  1281. struct termio    sg1, sg2;
  1282. X#else /* SYSV */
  1283. struct sgttyb    sg1, sg2;
  1284. X#endif /* SYSV */
  1285. X#endif /* BRLUNIX */
  1286. X
  1287. X#ifdef BIFF
  1288. private struct stat    tt_stat;    /* for biff */
  1289. X#ifndef BSD4_2
  1290. private char    *tt_name = 0;        /* name of the control tty */
  1291. extern char    *ttyname();        /* for systems w/o fchmod ... */
  1292. X#endif
  1293. private int    dw_biff = NO;        /* whether or not to fotz at all */
  1294. X#endif
  1295. X#endif /* UNIX */
  1296. X
  1297. int    errormsg;
  1298. extern char    *tfname;
  1299. char    NullStr[] = "";
  1300. X
  1301. X#ifdef MSDOS
  1302. X#define SIGHUP    99
  1303. X#endif /* MSDOS */
  1304. X
  1305. void
  1306. finish(code)
  1307. X{
  1308. X    int    CoreDump = (code != 0 && code != SIGHUP),
  1309. X        DelTmps = 1;        /* Usually we delete them. */
  1310. X
  1311. X    if (code == SIGINT) {
  1312. X        char    c;
  1313. X
  1314. X#ifndef MENLO_JCL
  1315. X        (void) signal(code, finish);
  1316. X#endif
  1317. X        f_mess("Abort (Type 'n' if you're not sure)? ");
  1318. X#ifndef MSDOS
  1319. X        (void) read(0, &c, 1);
  1320. X#else /* MSDOS */
  1321. X        c = getrawinchar();
  1322. X#endif /* MSDOS */
  1323. X        message(NullStr);
  1324. X        if ((c & 0377) != 'y') {
  1325. X            redisplay();
  1326. X            return;
  1327. X        }
  1328. X    }
  1329. X    ttyset(OFF);
  1330. X    UnsetTerm(NullStr);
  1331. X#ifndef MSDOS
  1332. X    if (code != 0) {
  1333. X        if (!Crashing) {
  1334. X            Crashing = YES;
  1335. X            lsave();
  1336. X            SyncRec();
  1337. X            printf("JOVE CRASH!! (code %d)\n", code);
  1338. X            if (ModBufs(1)) {
  1339. X                printf("Your buffers have been saved.\n");
  1340. X                printf("Use \"jove -r\" to have a look at them.\n");
  1341. X                DelTmps = 0;    /* Don't delete anymore. */
  1342. X            } else
  1343. X                printf("You didn't lose any work.\n");
  1344. X        } else
  1345. X            printf("\r\nYou may have lost your work!\n");
  1346. X    }
  1347. X#endif /* MSDOS */
  1348. X    flusho();
  1349. X    if (DelTmps) {
  1350. X        tmpclose();
  1351. X#ifndef MSDOS
  1352. X        recclose();
  1353. X#endif /* MSDOS */
  1354. X    }
  1355. X#ifdef UNIX
  1356. X    if (CoreDump)
  1357. X        abort();
  1358. X#ifdef PROFILING
  1359. X    exit(0);
  1360. X#else
  1361. X    _exit(0);
  1362. X#endif
  1363. X#else /* MSDOS or MAC*/
  1364. X#ifdef MSDOS
  1365. X    break_rst();    /* restore previous ctrl-c handling */
  1366. X#endif
  1367. X    exit(0);
  1368. X#endif /* UNIX */
  1369. X}
  1370. X
  1371. private char    smbuf[20],
  1372. X        *bp = smbuf;
  1373. private int    nchars = 0;
  1374. X
  1375. private char    peekbuf[10],
  1376. X        *peekp = peekbuf;
  1377. X
  1378. X#if defined(SYSV) || defined(M_XENIX)
  1379. void
  1380. setblock(fd, on)    /* turn blocking on or off */
  1381. register int    fd, on;
  1382. X{
  1383. X    static int blockf, nonblockf;
  1384. X    static int first = 1;
  1385. X    int flags;
  1386. X
  1387. X    if (first) {
  1388. X    first = 0;
  1389. X    if ((flags = fcntl(fd, F_GETFL, 0)) == -1)
  1390. X        finish(SIGHUP);
  1391. X    blockf = flags & ~O_NDELAY;    /* make sure O_NDELAY is off */
  1392. X    nonblockf = flags | O_NDELAY;    /* make sure O_NDELAY is on */
  1393. X    }
  1394. X    if (fcntl(fd, F_SETFL, on ? blockf : nonblockf) == -1)
  1395. X    finish(SIGHUP);
  1396. X}
  1397. X#endif /* SYSV */
  1398. X
  1399. int
  1400. Peekc()
  1401. X{
  1402. X    int    c;
  1403. X
  1404. X    if (peekp == peekbuf)
  1405. X        c = -1;
  1406. X    else
  1407. X        c = *--peekp & 0377;
  1408. X    return c;
  1409. X}
  1410. X
  1411. void
  1412. Ungetc(c)
  1413. X{
  1414. X    if (peekp == &peekbuf[(sizeof peekbuf) - 1])
  1415. X        return;        /* Sorry, can't oblige you ... */
  1416. X    *peekp++ = c;
  1417. X}
  1418. X
  1419. char    *Inputp = 0;
  1420. X
  1421. X#ifdef IPROCS
  1422. X#ifdef PIPEPROCS
  1423. getchar()
  1424. X{
  1425. X    extern int    errno;
  1426. X    register int    c;
  1427. X
  1428. X    if (nchars <= 0) {
  1429. X        do
  1430. X            nchars = read(0, smbuf, sizeof smbuf);
  1431. X#ifdef SYSV
  1432. X        while (nchars == 0 || (nchars < 0 && errno == EINTR));
  1433. X        if (nchars < 0)
  1434. X#else
  1435. X        while (nchars < 0 && errno == EINTR);
  1436. X        if (nchars <= 0)
  1437. X#endif /* SYSV */
  1438. X            finish(SIGHUP);
  1439. X        bp = smbuf;
  1440. X        InputPending = nchars > 1;
  1441. X    }
  1442. X    if (((c = *bp) & 0200) && MetaKey != 0) {
  1443. X        *bp = (c & CHARMASK);
  1444. X        return '\033';
  1445. X    }
  1446. X    nchars -= 1;
  1447. X    return (*bp++ & CHARMASK);
  1448. X}
  1449. X#else /* PIPEPROCS */
  1450. getchar()
  1451. X{
  1452. X    extern long    global_fd;
  1453. X    long        reads;
  1454. X    extern int    NumProcs,
  1455. X            errno;
  1456. X    register int    tmp,
  1457. X            nfds;
  1458. X    int        c;
  1459. X
  1460. X    if (nchars <= 0) {
  1461. X        /* Get a character from the keyboard, first checking for
  1462. X           any input from a process.  Handle that first, and then
  1463. X           deal with the terminal input. */
  1464. X        if (NumProcs > 0) {
  1465. X            do {
  1466. X                do {
  1467. X                    reads = global_fd;
  1468. X                    nfds = select(32, &reads, (long *)0, (long *)0, (struct timeval *)0);
  1469. X                } while (nfds < 0 && errno == EINTR);
  1470. X
  1471. X                switch (nfds) {
  1472. X                case -1:
  1473. X                    printf("\rerror %d in select %ld", errno, global_fd);
  1474. X                    global_fd = 1;
  1475. X                    break;
  1476. X                default:
  1477. X                    if (reads & 01) {
  1478. X                        nchars = read(0, smbuf, sizeof(smbuf));
  1479. X                        reads &= ~01;
  1480. X                        nfds -= 1;
  1481. X                    }
  1482. X
  1483. X                    while (nfds--) {
  1484. X                        tmp = ffs(reads) - 1;
  1485. X                        read_proc(tmp);
  1486. X                        reads &= ~(1L << tmp);
  1487. X                    }
  1488. X
  1489. X                    break;
  1490. X                }
  1491. X            } while (nchars <= 0);
  1492. X        } else {
  1493. X            do
  1494. X                nchars = read(0, smbuf, sizeof(smbuf));
  1495. X            while (nchars < 0 && errno == EINTR);
  1496. X        }
  1497. X
  1498. X        if (nchars <= 0)
  1499. X            finish(SIGHUP);
  1500. X
  1501. X        bp = smbuf;
  1502. X        InputPending = (nchars > 1);
  1503. X    }
  1504. X
  1505. X    if (((c = *bp) & 0200) && MetaKey != 0) {
  1506. X        *bp = (c & CHARMASK);
  1507. X        return '\033';
  1508. X    }
  1509. X    nchars -= 1;
  1510. X    return *bp++ & 0377;
  1511. X}
  1512. X#endif /* PIPEPROCS */
  1513. X#else /* IPROCS */
  1514. int
  1515. getchar()
  1516. X{
  1517. X    extern int    errno;
  1518. X    register int    c;
  1519. X
  1520. X    if (nchars <= 0) {
  1521. X        do {
  1522. X#ifdef MSDOS
  1523. X            *smbuf = getrawinchar();
  1524. X            nchars = 1;
  1525. X#else
  1526. X            nchars = read(0, smbuf, sizeof smbuf);
  1527. X#endif
  1528. X        } while (nchars < 0
  1529. X#ifndef MSDOS
  1530. X            && errno == EINTR
  1531. X#endif
  1532. X            );
  1533. X
  1534. X        if (nchars <= 0)
  1535. X            finish(SIGHUP);
  1536. X        bp = smbuf;
  1537. X        InputPending = nchars > 1;
  1538. X    }
  1539. X    if (((c = *bp) & 0200) && MetaKey != 0) {
  1540. X        *bp = (c & CHARMASK);
  1541. X        return '\033';
  1542. X    }
  1543. X    nchars -= 1;
  1544. X    return *bp++ & 0377;
  1545. X}
  1546. X
  1547. X#endif /* IPROCS */
  1548. X
  1549. int    InputPending = 0;
  1550. X
  1551. X/* Returns non-zero if a character waiting */
  1552. X
  1553. int
  1554. charp()
  1555. X{
  1556. X#ifndef MSDOS
  1557. X    int    some = 0;
  1558. X#endif /* MSDOS */
  1559. X
  1560. X    if (InJoverc != 0 || nchars > 0 || Inputp != 0)
  1561. X        return 1;
  1562. X#ifdef BRLUNIX
  1563. X    {
  1564. X        static struct sg_brl gttyBuf;
  1565. X
  1566. X        gtty(0, (char *) >tyBuf);
  1567. X        if (gttyBuf.sg_xflags & INWAIT)
  1568. X            some += 1;
  1569. X    }
  1570. X#endif
  1571. X#ifdef FIONREAD
  1572. X    {
  1573. X        long c;
  1574. X
  1575. X        if (ioctl(0, FIONREAD, (struct sgttyb *) &c) == -1)
  1576. X            c = 0;
  1577. X        some = (c > 0);
  1578. X    }
  1579. X#endif /* FIONREAD */
  1580. X#if defined(SYSV) || defined(M_XENIX)
  1581. X    setblock(0, 0);        /* turn blocking off */
  1582. X    nchars = read(0, smbuf, sizeof smbuf);    /* Is anything there? */
  1583. X    setblock(0, 1);        /* turn blocking on */
  1584. X    if (nchars > 0)        /* something was there */
  1585. X        bp = smbuf;        /* make sure bp points to it */
  1586. X    some = (nchars > 0);    /* just say we found something */
  1587. X#endif /* SYSV */
  1588. X#ifdef c70
  1589. X    some = !empty(0);
  1590. X#endif
  1591. X#ifdef MSDOS
  1592. X    return rawkey_ready();
  1593. X#else
  1594. X#ifdef MAC
  1595. X    some = rawchkc();
  1596. X#endif
  1597. X    return some;
  1598. X#endif /* MSDOS */
  1599. X}
  1600. X
  1601. X#ifdef TERMCAP
  1602. void
  1603. ResetTerm()
  1604. X{
  1605. X    putpad(TI, 1);
  1606. X    putpad(VS, 1);
  1607. X    putpad(KS, 1);
  1608. X#ifndef MSDOS
  1609. X    (void) chkmail(YES);    /* force it to check to we can be accurate */
  1610. X#endif
  1611. X#ifdef BIFF
  1612. X    if (BiffChk != dw_biff)
  1613. X        biff_init();
  1614. X    /* just in case we changed our minds about whether to deal with
  1615. X       biff */
  1616. X#endif
  1617. X    do_sgtty();        /* this is so if you change baudrate or stuff
  1618. X                   like that, JOVE will notice. */
  1619. X    ttyset(ON);
  1620. X}
  1621. X
  1622. void
  1623. UnsetTerm(mesg)
  1624. char    *mesg;
  1625. X{
  1626. X    ttyset(OFF);
  1627. X    putpad(KE, 1);
  1628. X    putpad(VE, 1);
  1629. X    putpad(TE, 1);
  1630. X#ifdef ID_CHAR
  1631. X    INSmode(0);
  1632. X#endif
  1633. X    Placur(ILI, 0);
  1634. X    printf("%s", mesg);
  1635. X    putpad(CE, 1);
  1636. X    flusho();
  1637. X}
  1638. X#endif /* TERMCAP */
  1639. X
  1640. X#ifdef JOB_CONTROL
  1641. PauseJove()
  1642. X{
  1643. X    UnsetTerm(ModBufs(0) ? "[There are modified buffers]" : NullStr);
  1644. X    (void) kill(0, SIGTSTP);
  1645. X    ResetTerm();
  1646. X    ClAndRedraw();
  1647. X}
  1648. X#endif
  1649. X
  1650. X
  1651. X#ifndef MAC
  1652. void
  1653. Push()
  1654. X{
  1655. X    int
  1656. X#ifndef MSDOS
  1657. X        pid,
  1658. X        (*old_quit)() = signal(SIGQUIT, SIG_IGN),
  1659. X#endif /* MSDOS */
  1660. X           (*old_int)() = signal(SIGINT, SIG_IGN);
  1661. X
  1662. X#ifndef MSDOS
  1663. X#ifdef IPROCS
  1664. X    sighold(SIGCHLD);
  1665. X#endif
  1666. X    switch (pid = fork()) {
  1667. X    case -1:
  1668. X        complain("[Fork failed]");
  1669. X
  1670. X    case 0:
  1671. X        UnsetTerm(NullStr);
  1672. X#ifdef IPROCS
  1673. X        sigrelse(SIGCHLD);
  1674. X#endif
  1675. X        (void) signal(SIGTERM, SIG_DFL);
  1676. X#else /* MSDOS */
  1677. X    UnsetTerm(NullStr);
  1678. X#endif /* MSDOS */
  1679. X        (void) signal(SIGINT, SIG_DFL);
  1680. X#ifdef UNIX
  1681. X        (void) signal(SIGQUIT, SIG_DFL);
  1682. X        execl(Shell, basename(Shell), (char *)0);
  1683. X        message("[Execl failed]");
  1684. X        _exit(1);
  1685. X    }
  1686. X        dowait(pid, (int *) 0);
  1687. X#ifdef IPROCS
  1688. X    sigrelse(SIGCHLD);
  1689. X#endif
  1690. X#endif /* UNIX */
  1691. X#ifdef MSDOS
  1692. X    break_rst();
  1693. X    if (spawnl(0, Shell, basename(Shell), (char *)0) == -1)
  1694. X        message("[Spawn failed]"); 
  1695. X#endif /* MSDOS */
  1696. X        ResetTerm();
  1697. X        ClAndRedraw();
  1698. X#ifndef MSDOS
  1699. X    (void) signal(SIGQUIT, old_quit);
  1700. X#else /* MSDOS */
  1701. X    break_off();
  1702. X#ifdef CHDIR
  1703. X    getCWD();
  1704. X#endif    
  1705. X#endif /* MSDOS */
  1706. X        (void) signal(SIGINT, old_int);
  1707. X}
  1708. X#endif /* MAC */
  1709. X
  1710. int    OKXonXoff = 0,        /* ^S and ^Q initially DON'T work */
  1711. X    IntChar = CTL(']');
  1712. X
  1713. void
  1714. ttsize()
  1715. X{
  1716. X#ifdef UNIX
  1717. X#ifdef TIOCGWINSZ
  1718. X    struct winsize win;
  1719. X
  1720. X    if (ioctl (0, TIOCGWINSZ, &win) == 0) {
  1721. X        if (win.ws_col)
  1722. X            CO = win.ws_col;
  1723. X        if (win.ws_row)
  1724. X            LI = win.ws_row;
  1725. X    }
  1726. X#else /* TIOCGWINSZ */
  1727. X#ifdef BTL_BLIT
  1728. X#include <sys/jioctl.h>
  1729. X    struct jwinsize jwin;
  1730. X
  1731. X    if (ioctl(0, JWINSIZE, &jwin) == 0) {
  1732. X        if (jwin.bytesx)
  1733. X            CO = jwin.bytesx;
  1734. X        if (jwin.bytesy)
  1735. X            LI = jwin.bytesy;
  1736. X    }
  1737. X#endif /* BTL_BLIT */
  1738. X#endif /* TIOCGWINSZ */
  1739. X#endif /* UNIX */
  1740. X    ILI = LI - 1;
  1741. X}
  1742. X
  1743. X#ifdef BIFF
  1744. biff_init()
  1745. X{
  1746. X    dw_biff = ((BiffChk) &&
  1747. X#ifndef BSD4_2
  1748. X           ((tt_name != 0) || (tt_name = ttyname(0))) &&
  1749. X           (stat(tt_name, &tt_stat) != -1) &&
  1750. X#else
  1751. X           (fstat(0, &tt_stat) != -1) &&
  1752. X#endif
  1753. X           (tt_stat.st_mode & S_IEXEC));    /* he's using biff */
  1754. X
  1755. X}
  1756. X
  1757. biff(on)
  1758. X{
  1759. X    if (dw_biff == NO)
  1760. X        return;
  1761. X#ifndef BSD4_2
  1762. X    (void) chmod(tt_name, on ? tt_stat.st_mode :
  1763. X                   (tt_stat.st_mode & ~S_IEXEC));
  1764. X#else
  1765. X    (void) fchmod(0, on ? tt_stat.st_mode :
  1766. X                  (tt_stat.st_mode & ~S_IEXEC));
  1767. X#endif
  1768. X}
  1769. X
  1770. X#endif
  1771. X
  1772. void
  1773. ttinit()
  1774. X{
  1775. X#ifdef BIFF
  1776. X    biff_init();
  1777. X#endif
  1778. X#ifdef TIOCSLTC
  1779. X    (void) ioctl(0, TIOCGLTC, (struct sgttyb *) &ls1);
  1780. X    ls2 = ls1;
  1781. X    ls2.t_suspc = (char) -1;
  1782. X    ls2.t_dsuspc = (char) -1;
  1783. X    ls2.t_flushc = (char) -1;
  1784. X    ls2.t_lnextc = (char) -1;
  1785. X#endif
  1786. X
  1787. X#ifdef TIOCGETC
  1788. X    /* Change interupt and quit. */
  1789. X    (void) ioctl(0, TIOCGETC, (struct sgttyb *) &tc1);
  1790. X    tc2 = tc1;
  1791. X    tc2.t_intrc = IntChar;
  1792. X    tc2.t_quitc = (char) -1;
  1793. X    if (OKXonXoff) {
  1794. X        tc2.t_stopc = (char) -1;
  1795. X        tc2.t_startc = (char) -1;
  1796. X    }
  1797. X#endif /* TIOCGETC */
  1798. X    do_sgtty();
  1799. X}
  1800. X
  1801. private int    done_ttinit = 0;
  1802. X
  1803. void
  1804. do_sgtty()
  1805. X{
  1806. X#ifdef UNIX
  1807. X#ifdef SYSV
  1808. X    (void) ioctl(0, TCGETA, (char *) &sg1);
  1809. X#else
  1810. X    (void) gtty(0, &sg1);
  1811. X#endif /* SYSV */
  1812. X    sg2 = sg1;
  1813. X
  1814. X#ifdef LPASS8
  1815. X    (void) ioctl(0, TIOCLGET, &lm_word1);
  1816. X    lm_word2 = lm_word1;
  1817. X    if (MetaKey == YES)
  1818. X        lm_word2 |= LPASS8;
  1819. X#endif
  1820. X
  1821. X#ifdef SYSV
  1822. X    TABS = !((sg1.c_oflag & TAB3) == TAB3);
  1823. X    ospeed = sg1.c_cflag & CBAUD;
  1824. X
  1825. X    if (OKXonXoff)
  1826. X        sg2.c_iflag &= ~(IXON | IXOFF);
  1827. X    sg2.c_iflag &= ~(INLCR|ICRNL|IGNCR);
  1828. X    sg2.c_lflag &= ~(ISIG|ICANON|ECHO);
  1829. X    sg2.c_oflag &= ~(OCRNL|ONLCR);
  1830. X    sg2.c_cc[VMIN] = sizeof smbuf;
  1831. X    sg2.c_cc[VTIME] = 1;
  1832. X#else
  1833. X    TABS = !(sg1.sg_flags & XTABS);
  1834. X    ospeed = sg1.sg_ospeed;
  1835. X#ifdef BRLUNIX
  1836. X    sg2.sg_flags &= ~(ECHO | CRMOD);
  1837. X    sg2.sg_flags |= CBREAK;
  1838. X
  1839. X    /* VT100 Kludge: leave STALL on for flow control if DC3DC1 (Yuck.) */
  1840. X    sg2.sg_xflags &= ~((sg2.sg_xflags&DC3DC1 ? 0 : STALL) | PAGE);
  1841. X#else
  1842. X    sg2.sg_flags &= ~(ECHO | CRMOD);
  1843. X#endif /* BRLUNIX */
  1844. X
  1845. X#ifdef EUNICE
  1846. X    sg2.sg_flags |= RAW;    /* Eunice needs RAW mode last I heard. */
  1847. X#else
  1848. X#ifdef PURDUE_EE
  1849. X#   ifdef pdp11
  1850. X    sg2.sg_flags |= RAW;
  1851. X#   else
  1852. X    sg2.sg_flags |= (MetaKey ? RAW : CBREAK);
  1853. X#   endif
  1854. X#else
  1855. X#   ifdef LPASS8
  1856. X    sg2.sg_flags |= CBREAK;
  1857. X#   else
  1858. X    sg2.sg_flags |= (MetaKey ? RAW : CBREAK);
  1859. X#   endif
  1860. X#endif /* PURDUE_EE */
  1861. X#endif /* EUNICE */
  1862. X#endif /* SYSV */
  1863. X#endif /* UNIX */
  1864. X
  1865. X#ifdef MSDOS
  1866. X#    ifndef IBMPC
  1867. X    setmode(1, 0x8000);
  1868. X#    endif /* IBMPC */
  1869. X    TABS = 0;
  1870. X#endif /* MSDOS */
  1871. X}
  1872. X
  1873. void
  1874. tty_reset()
  1875. X{
  1876. X    if (!done_ttinit)
  1877. X        return;
  1878. X    ttyset(OFF);    /* go back to original modes */
  1879. X    ttinit();
  1880. X    ttyset(ON);
  1881. X}
  1882. X
  1883. X/* If n is OFF reset to original modes */
  1884. X
  1885. void
  1886. ttyset(n)
  1887. X{
  1888. X    if (!done_ttinit && n == 0)    /* Try to reset before we've set! */
  1889. X        return;
  1890. X#ifdef UNIX
  1891. X#   ifdef SYSV
  1892. X    (void) ioctl(0, TCSETAW, n == 0 ? (struct sgttyb *) &sg1 : (struct sgttyb *) &sg2);
  1893. X#   else
  1894. X#     ifdef BRLUNIX
  1895. X    (void) stty(0, n == 0 ? (struct sgttyb *) &sg1 : (struct sgttyb *) &sg2);
  1896. X#     else
  1897. X    (void) ioctl(0, TIOCSETN, n == 0 ? (struct sgttyb *) &sg1 : (struct sgttyb *) &sg2);
  1898. X#     endif /* BRLUNIX */
  1899. X#   endif /* SYSV */
  1900. X
  1901. X#   ifdef TIOCSETC
  1902. X    (void) ioctl(0, TIOCSETC, n == 0 ? (struct sgttyb *) &tc1 : (struct sgttyb *) &tc2);
  1903. X#   endif /* TIOCSETC */
  1904. X#   ifdef TIOCSLTC
  1905. X    (void) ioctl(0, TIOCSLTC, n == 0 ? (struct sgttyb *) &ls1 : (struct sgttyb *) &ls2);
  1906. X#   endif /* TIOCSLTC */
  1907. X#   ifdef LPASS8
  1908. X    (void) ioctl(0, TIOCLSET, n == 0 ? &lm_word1 : &lm_word2);
  1909. X#   endif
  1910. X#endif /* UNIX */
  1911. X
  1912. X#ifdef MSDOS
  1913. X#   ifndef IBMPC
  1914. X    setmode(1, n == 0 ? 0x4000 : 0x8000);
  1915. X#   endif /* IBMPC */
  1916. X#endif /* MSDOS */
  1917. X    done_ttinit = 1;
  1918. X#ifdef BIFF
  1919. X    biff(!n);
  1920. X#endif
  1921. X}
  1922. X
  1923. int    this_cmd,
  1924. X    last_cmd;
  1925. X
  1926. void
  1927. dispatch(c)
  1928. register int    c;
  1929. X{
  1930. X    data_obj    *cp;
  1931. X
  1932. X    this_cmd = 0;
  1933. X    cp = mainmap[c & CHARMASK];
  1934. X
  1935. X    if (cp == 0) {
  1936. X        rbell();
  1937. X        clr_arg_value();
  1938. X        errormsg = NO;
  1939. X        message(NullStr);
  1940. X    } else
  1941. X        ExecCmd(cp);
  1942. X}
  1943. X
  1944. int    LastKeyStruck,
  1945. X    MetaKey = 0;
  1946. X
  1947. int
  1948. getch()
  1949. X{
  1950. X    register int    c,
  1951. X            peekc;
  1952. X#ifdef IPROCS
  1953. X    extern int    NumProcs;
  1954. X#endif
  1955. X    extern int    ModCount,
  1956. X            Interactive;
  1957. X
  1958. X    if (Inputp) {
  1959. X        if ((c = *Inputp++) != 0)
  1960. X            return LastKeyStruck = c;
  1961. X        Inputp = 0;
  1962. X    }
  1963. X
  1964. X    if (InJoverc)
  1965. X        return EOF;    /* somethings wrong if Inputp runs out while
  1966. X                   we're reading a .joverc file. */
  1967. X
  1968. X#ifndef MSDOS
  1969. X    if (ModCount >= SyncFreq) {
  1970. X        ModCount = 0;
  1971. X        SyncRec();
  1972. X    }
  1973. X#endif /* MSDOS */
  1974. X
  1975. X    /* If we're not interactive and we're not executing a macro,
  1976. X       AND there are no ungetc'd characters, we read from the
  1977. X       terminal (i.e., getch()).  And characters only get put
  1978. X       in macros from inside this if. */
  1979. X    if (((peekc = c = Peekc()) == -1) && (Interactive || ((c = mac_getc()) == -1))) {
  1980. X        /* So messages that aren't error messages don't
  1981. X           hang around forever. */
  1982. X        if (!UpdMesg && !Asking) {    /* Don't erase if we are asking */
  1983. X            if (mesgbuf[0] && !errormsg)
  1984. X                message(NullStr);
  1985. X        }
  1986. X        redisplay();
  1987. X#ifdef IPROCS
  1988. X#  ifdef PIPEPROCS
  1989. X        if (NumProcs > 0) {
  1990. X            sigrelse(INPUT_SIG);
  1991. X            sigrelse(SIGCHLD);
  1992. X        }
  1993. X#  endif
  1994. X#endif
  1995. X#ifdef UNIX
  1996. X        inIOread = 1;
  1997. X#endif
  1998. X        if ((c = getchar()) == EOF)
  1999. X            finish(SIGHUP);
  2000. X#ifdef UNIX
  2001. X        inIOread = 0;
  2002. X#endif
  2003. X
  2004. X#ifdef IPROCS
  2005. X#  ifdef PIPEPROCS
  2006. X        if (NumProcs > 0) {
  2007. X            sighold(INPUT_SIG);
  2008. X            sighold(SIGCHLD);
  2009. X        }
  2010. X#  endif
  2011. X#endif
  2012. X        if (!Interactive && InMacDefine)
  2013. X            mac_putc(c);
  2014. X    }
  2015. X    if (peekc == -1)    /* don't add_stroke peekc's */
  2016. X        add_stroke(c);
  2017. X    return LastKeyStruck = c;
  2018. X}
  2019. X
  2020. X#ifdef UNIX
  2021. dorecover()
  2022. X{
  2023. X    execl(Recover, "recover", "-d", TmpFilePath, (char *) 0);
  2024. X    printf("%s: execl failed!\n", Recover);
  2025. X    flusho();
  2026. X    _exit(-1);
  2027. X}
  2028. X#endif /* UNIX */
  2029. X        
  2030. X
  2031. void
  2032. ShowVersion()
  2033. X{
  2034. X    extern char    *version;
  2035. X
  2036. X    s_mess("Jonathan's Own Version of Emacs (%s)", version);
  2037. X}
  2038. X
  2039. void
  2040. UNIX_cmdline(argc, argv)
  2041. char    *argv[];
  2042. X{
  2043. X    int    lineno = 0,
  2044. X        nwinds = 1;
  2045. X    Buffer    *b;
  2046. X
  2047. X    ShowVersion();
  2048. X    while (argc > 1) {
  2049. X        if (argv[1][0] != '-' && argv[1][0] != '+') {
  2050. X            int    force = (nwinds > 0 || lineno != 0);
  2051. X
  2052. X#ifdef MSDOS
  2053. X            strlwr(argv[1]);
  2054. X#endif /* MSDOS */
  2055. X            minib_add(argv[1], force ? YES : NO);
  2056. X            b = do_find(nwinds > 0 ? curwind : (Window *) 0,
  2057. X                    argv[1], force);
  2058. X            if (force) {
  2059. X                SetABuf(curbuf);
  2060. X                SetBuf(b);
  2061. X                if (lineno >= 0)
  2062. X                    SetLine(next_line(curbuf->b_first, lineno));
  2063. X                else
  2064. X                    SetLine(curbuf->b_last);
  2065. X                if (nwinds > 1)
  2066. X                    NextWindow();
  2067. X                if (nwinds)
  2068. X                    nwinds -= 1;
  2069. X            }
  2070. X            lineno = 0;
  2071. X        } else    switch (argv[1][1]) {
  2072. X            case 'd':
  2073. X                argv += 1;
  2074. X                argc -= 1;
  2075. X                break;
  2076. X
  2077. X            case 'j':    /* Ignore .joverc in HOME */
  2078. X                break;
  2079. X#ifndef MAC
  2080. X            case 'p':
  2081. X                argv += 1;
  2082. X                argc -= 1;
  2083. X                if (argv[1] != 0) {
  2084. X                    SetBuf(do_find(curwind, argv[1], 0));
  2085. X                    ErrParse();
  2086. X                    nwinds = 0;
  2087. X                }
  2088. X                break;
  2089. X#endif
  2090. X            case 't':
  2091. X                 /* check if syntax is -tTag or -t Tag */
  2092. X                 if (argv[1][2] != 0) {
  2093. X                     find_tag(&(argv[1][2]), YES);
  2094. X                 } else {
  2095. X                    argv += 1;
  2096. X                    argc -= 1;
  2097. X                    if (argv[1] != 0)
  2098. X                        find_tag(argv[1], YES);
  2099. X                 }
  2100. X                  break;
  2101. X  
  2102. X            case 'w':
  2103. X                if (argv[1][2] == '\0')
  2104. X                    nwinds += 1;
  2105. X                else {
  2106. X                    int    n;
  2107. X
  2108. X                    (void) chr_to_int(&argv[1][2], 10, NO, &n);
  2109. X                    nwinds += -1 + n;
  2110. X                }
  2111. X                (void) div_wind(curwind, nwinds - 1);
  2112. X                break;
  2113. X
  2114. X            case '0':
  2115. X            case '1':
  2116. X            case '2':
  2117. X            case '3':
  2118. X            case '4':
  2119. X            case '5':
  2120. X            case '6':
  2121. X            case '7':
  2122. X            case '8':
  2123. X            case '9':
  2124. X                (void) chr_to_int(&argv[1][1], 10, NO, &lineno);
  2125. X                lineno -= 1;
  2126. X                break;
  2127. X            case  0: 
  2128. X                lineno = -1;    /* goto end of file ... */
  2129. X                break;        /* just like some people's */
  2130. X        }                /* favourite editor */
  2131. X        argv += 1;
  2132. X        argc -= 1;
  2133. X    }
  2134. X}
  2135. X
  2136. X/* VARARGS1 */
  2137. X
  2138. void
  2139. error(fmt, va_alist)
  2140. char    *fmt;
  2141. va_dcl
  2142. X{
  2143. X    va_list    ap;
  2144. X
  2145. X    if (fmt) {
  2146. X        va_start(ap);
  2147. X        format(mesgbuf, sizeof mesgbuf, fmt, ap);
  2148. X        va_end(ap);
  2149. X        UpdMesg = YES;
  2150. X    }
  2151. X    rbell();
  2152. X    longjmp(mainjmp, ERROR);
  2153. X}
  2154. X
  2155. X/* VARARGS1 */
  2156. X
  2157. void
  2158. complain(fmt, va_alist)
  2159. char    *fmt;
  2160. va_dcl
  2161. X{
  2162. X    va_list    ap;
  2163. X
  2164. X    if (fmt) {
  2165. X        va_start(ap);
  2166. X        format(mesgbuf, sizeof mesgbuf, fmt, ap);
  2167. X        va_end(ap);
  2168. X        UpdMesg = YES;
  2169. X    }
  2170. X    rbell();
  2171. X    longjmp(mainjmp, COMPLAIN);
  2172. X}
  2173. X
  2174. X/* VARARGS1 */
  2175. X
  2176. void
  2177. confirm(fmt, va_alist)
  2178. char    *fmt;
  2179. va_dcl
  2180. X{
  2181. X    char    *yorn;
  2182. X    va_list    ap;
  2183. X
  2184. X    va_start(ap);
  2185. X    format(mesgbuf, sizeof mesgbuf, fmt, ap);
  2186. X    va_end(ap);
  2187. X    yorn = ask((char *) 0, mesgbuf);
  2188. X    if (*yorn != 'Y' && *yorn != 'y')
  2189. X        longjmp(mainjmp, COMPLAIN);
  2190. X}
  2191. X
  2192. int    RecDepth = 0;
  2193. X
  2194. void
  2195. Recur()
  2196. X{
  2197. X    char    bname[128];
  2198. X    Mark    *m;
  2199. X
  2200. X    sprintf(bname, "%s", curbuf->b_name);
  2201. X    m = MakeMark(curline, curchar, M_FLOATER);
  2202. X
  2203. X    RecDepth += 1;
  2204. X    UpdModLine = YES;
  2205. X    DoKeys(1);    /* 1 means not first time */
  2206. X    UpdModLine = YES;
  2207. X    RecDepth -= 1;
  2208. X    SetBuf(do_select(curwind, bname));
  2209. X    if (!is_an_arg())
  2210. X        ToMark(m);
  2211. X    DelMark(m);
  2212. X}
  2213. X
  2214. jmp_buf    mainjmp;
  2215. X
  2216. X#ifdef MAC
  2217. jmp_buf auxjmp;
  2218. X#endif
  2219. X
  2220. int    iniargc;    /* main sets these for DoKeys() */
  2221. char    **iniargv;
  2222. X
  2223. void
  2224. DoKeys(nocmdline)
  2225. X{
  2226. X    int    c;
  2227. X    jmp_buf    savejmp;
  2228. X
  2229. X    push_env(savejmp);
  2230. X
  2231. X    switch (setjmp(mainjmp)) {
  2232. X    case 0:
  2233. X        if (!nocmdline)
  2234. X            UNIX_cmdline(iniargc, iniargv);
  2235. X        break;
  2236. X
  2237. X    case QUIT:
  2238. X        if (RecDepth == 0) {
  2239. X            if (ModMacs()) {
  2240. X                rbell();
  2241. X                if (CharUpcase(*ask("No",
  2242. X"Some MACROS haven't been saved; leave anyway? ")) != 'Y')
  2243. X                    break;
  2244. X            }
  2245. X            if (ModBufs(0)) {
  2246. X                rbell();
  2247. X                if (CharUpcase(*ask("No",
  2248. X"Some buffers haven't been saved; leave anyway? ")) != 'Y')
  2249. X                    break;
  2250. X            }
  2251. X#ifdef IPROCS
  2252. X            KillProcs();
  2253. X#endif
  2254. X        }
  2255. X        pop_env(savejmp);
  2256. X        return;
  2257. X
  2258. X    case ERROR:
  2259. X        getDOT();    /* God knows what state linebuf was in */
  2260. X
  2261. X    case COMPLAIN:
  2262. X        {
  2263. X        extern int    DisabledRedisplay;
  2264. X
  2265. X        gc_openfiles();    /* close any files we left open */
  2266. X        errormsg = YES;
  2267. X        unwind_macro_stack();
  2268. X        Asking = 0;
  2269. X        curwind->w_bufp = curbuf;
  2270. X        DisabledRedisplay = NO;
  2271. X        redisplay();
  2272. X        break;
  2273. X        }
  2274. X    }
  2275. X
  2276. X    this_cmd = last_cmd = 0;
  2277. X
  2278. X    for (;;) {
  2279. X#ifdef MAC
  2280. X        setjmp(auxjmp);
  2281. X#endif
  2282. X        if (this_cmd != ARG_CMD) {
  2283. X            clr_arg_value();
  2284. X            last_cmd = this_cmd;
  2285. X            init_strokes();
  2286. X        }
  2287. X#ifdef MAC
  2288. X        HiliteMenu(0);
  2289. X        EventCmd = 0;
  2290. X        menus_on();
  2291. X#endif
  2292. X        c = getch();
  2293. X        if (c == -1)
  2294. X            continue;
  2295. X         dispatch(c);
  2296. X    }
  2297. X}
  2298. X
  2299. int    Crashing = 0;
  2300. X
  2301. char **
  2302. scanvec(args, str)
  2303. register char    **args,
  2304. X        *str;
  2305. X{
  2306. X    while (*args) {
  2307. X        if (strcmp(*args, str) == 0)
  2308. X            return args;
  2309. X        args += 1;
  2310. X    }
  2311. X    return 0;
  2312. X}
  2313. X
  2314. X#ifdef UNIX
  2315. int    UpdFreq = 30,
  2316. X    inIOread = 0;
  2317. X
  2318. updmode()
  2319. X{
  2320. X    UpdModLine = YES;
  2321. X    if (inIOread)
  2322. X        redisplay();
  2323. X#ifndef JOB_CONTROL
  2324. X    (void) signal(SIGALRM, updmode);
  2325. X#endif
  2326. X    (void) alarm((unsigned) UpdFreq);
  2327. X}
  2328. X#endif /* UNIX */
  2329. X
  2330. X#ifndef MSDOS
  2331. X#ifdef TIOCGWINSZ
  2332. X#ifdef SIGWINCH
  2333. extern win_reshape();
  2334. X#endif
  2335. X#endif
  2336. X#else /* MSDOS */
  2337. X#ifndef IBMPC
  2338. char    ttbuf[BUFSIZ];
  2339. X#endif    /* IBMPC */
  2340. X#endif /* MSDOS */
  2341. X
  2342. X#ifdef TIOCGWINSZ
  2343. X#ifdef SIGWINCH
  2344. win_reshape()
  2345. X{
  2346. X    register int oldsize;
  2347. X    register int newsize, total;
  2348. X    register Window *wp;
  2349. X
  2350. X    (void) signal(SIGWINCH, SIG_IGN);
  2351. X
  2352. X    /*
  2353. X     * Save old number of lines.
  2354. X     */
  2355. X    oldsize = LI;
  2356. X
  2357. X    /*
  2358. X     * Get new line/col info.
  2359. X     */
  2360. X    ttsize();
  2361. X
  2362. X    /*
  2363. X     * LI has changed, and now holds the
  2364. X     * new value.
  2365. X     */
  2366. X    /* 
  2367. X     *  Go through the window list, changing each window size in
  2368. X     *  proportion to the resize. If a window becomes too small,
  2369. X     *  delete it. We keep track of all the excess lines (caused by
  2370. X     *  roundoff!), and give them to the current window, as a sop -
  2371. X     *  can't be more than one or two lines anyway. This seems fairer
  2372. X     *  than just resizing the current window.
  2373. X     */
  2374. X    wp = fwind;
  2375. X    total = 0;
  2376. X    do {
  2377. X        newsize = LI * wp->w_height / oldsize;
  2378. X
  2379. X        if (newsize < 2) {
  2380. X            total += wp->w_height;
  2381. X            wp = wp->w_next;
  2382. X            del_wind(wp->w_prev);
  2383. X        } else {
  2384. X            wp->w_height = newsize;
  2385. X            total += newsize;
  2386. X            wp = wp->w_next;
  2387. X        }
  2388. X    } while (wp != fwind);
  2389. X
  2390. X    curwind->w_height += LI - total - 1;
  2391. X
  2392. X    /* Make a new screen structure */
  2393. X    make_scr();
  2394. X    /* Do a 'hard' update on the screen - clear and redraw */
  2395. X    cl_scr(1);
  2396. X    flusho();
  2397. X    redisplay();
  2398. X
  2399. X    (void) signal(SIGWINCH, win_reshape);
  2400. X}
  2401. X#endif
  2402. X#endif
  2403. X
  2404. void
  2405. X
  2406. X#ifdef MAC    /* will get args from user, if option key held during launch */
  2407. main()
  2408. X{
  2409. X    int argc;
  2410. X    char **argv;
  2411. X#else
  2412. main(argc, argv)
  2413. char    *argv[];
  2414. X{
  2415. X#endif /* MAC */
  2416. X
  2417. X#ifndef MSDOS
  2418. X    char    ttbuf[MAXTTYBUF],
  2419. X#ifndef VMUNIX
  2420. X        s_iobuff[LBSIZE],
  2421. X        s_genbuf[LBSIZE],
  2422. X        s_linebuf[LBSIZE],
  2423. X#endif
  2424. X        *cp;
  2425. X
  2426. X
  2427. X#ifndef VMUNIX
  2428. X    /* The way I look at it, there ain't no way I is gonna run
  2429. X       out of stack space UNLESS I have some kind of infinite
  2430. X       recursive bug.  So why use up some valuable memory, when
  2431. X       there is plenty of space on the stack?  (This only matters
  2432. X       on wimpy pdp11's, of course.) */
  2433. X
  2434. X    iobuff = s_iobuff;
  2435. X    genbuf = s_genbuf;
  2436. X    linebuf = s_linebuf;
  2437. X#endif
  2438. X
  2439. X#else /* MSDOS */
  2440. X    char    *cp,
  2441. X        *getenv();
  2442. X#endif /* MSDOS */
  2443. X
  2444. X    errormsg = 0;
  2445. X
  2446. X#ifdef MAC
  2447. X    MacInit();        /* initializes all */
  2448. X    if(make_cache() == 0) exit(-1);
  2449. X    argc = getArgs(&argv);
  2450. X#endif /* MAC */
  2451. X
  2452. X    iniargc = argc;
  2453. X    iniargv = argv;
  2454. X
  2455. X    if (setjmp(mainjmp)) {
  2456. X        printf("\rAck! I can't deal with error \"%s\" now.\n\r", mesgbuf);
  2457. X        finish(0);
  2458. X    }
  2459. X
  2460. X#ifdef MSDOS
  2461. X    /* import the temporary file path from the environment and
  2462. X       fix the string, so that we can append a slash safely    */
  2463. X
  2464. X    if (((cp = getenv("TMP")) || (cp = getenv("TMPDIR"))) &&
  2465. X        (*cp != '\0')) {
  2466. X        strcpy(TmpFilePath, cp);
  2467. X        cp = &TmpFilePath[strlen(TmpFilePath)-1];
  2468. X        if ((*cp == '/') || (*cp == '\\'))
  2469. X            *cp = 0;
  2470. X    }
  2471. X    ShFlags[0] = switchar();
  2472. X#endif /* MSDOS */
  2473. X
  2474. X    getTERM();    /* Get terminal. */
  2475. X    if (getenv("METAKEY"))
  2476. X        MetaKey = 1;
  2477. X    ttsize();
  2478. X    InitCM();
  2479. X#ifdef MAC
  2480. X    InitEvents();
  2481. X#endif
  2482. X
  2483. X    d_cache_init();        /* initialize the disk buffer cache */
  2484. X#ifndef MAC
  2485. X    if ((cp = getenv("COMSPEC")) && (*cp != '\0')) {
  2486. X        strcpy(Shell, cp);
  2487. X    }
  2488. X#endif
  2489. X#ifdef MSDOS
  2490. X    if ((cp = getenv("DESCRIBE")) && (*cp != '\0'))
  2491. X       strcpy(CmdDb, cp);
  2492. X#endif /* MSDOS */
  2493. X
  2494. X    make_scr();
  2495. X    mac_init();    /* Initialize Macros */
  2496. X    winit();    /* Initialize Window */
  2497. X#ifdef IPROCS
  2498. X    pinit();    /* Pipes/process initialization */
  2499. X#endif
  2500. X    SetBuf(do_select(curwind, Mainbuf));
  2501. X
  2502. X#ifdef CHDIR
  2503. X    {
  2504. X        char    **argp;
  2505. X
  2506. X        if ((argp = scanvec(argv, "-d")) && (argp[1][0] == '/'))
  2507. X            setCWD(argp[1]);
  2508. X        else
  2509. X            getCWD();    /* After we setup curbuf in case we have to getwd() */
  2510. X    }
  2511. X#endif
  2512. X    HomeDir = getenv("HOME");
  2513. X    if (HomeDir == 0)
  2514. X        HomeDir = "/";
  2515. X    HomeLen = strlen(HomeDir);
  2516. X
  2517. X#ifdef UNIX
  2518. X#ifdef SYSV
  2519. X    sprintf(Mailbox, "/usr/mail/%s", getenv("LOGNAME"));
  2520. X#else
  2521. X    sprintf(Mailbox, "/usr/spool/mail/%s", getenv("USER"));
  2522. X#endif /* SYSV */
  2523. X#endif /* UNIX */
  2524. X#ifdef MSDOS
  2525. X    if ((cp = getenv("JOVERC")) && (*cp != '\0'))
  2526. X       (void) joverc(cp);
  2527. X#endif /* MSDOS */
  2528. X    (void) joverc(Joverc);
  2529. X    if (!scanvec(argv, "-j")) {
  2530. X        char    tmpbuf[100];
  2531. X        sprintf(tmpbuf, "%s/.joverc", HomeDir);
  2532. X        (void) joverc(tmpbuf);
  2533. X    }
  2534. X#ifndef MSDOS
  2535. X    if (scanvec(argv, "-r"))
  2536. X        dorecover();
  2537. X    if (scanvec(argv, "-rc"))
  2538. X        FullRecover();
  2539. X#endif     /* MSDOS */
  2540. X    ttinit();    /* initialize terminal (after ~/.joverc) */
  2541. X#ifndef IBMPC
  2542. X    settout(ttbuf);    /* not until we know baudrate */
  2543. X#endif
  2544. X
  2545. X#ifdef MSDOS
  2546. X    (void) signal(SIGINT, SIG_IGN);
  2547. X    break_off();    /* disable ctrl-c checking */
  2548. X#endif /* MSDOS */
  2549. X#ifdef UNIX
  2550. X    (void) signal(SIGHUP, finish);
  2551. X    (void) signal(SIGINT, finish);
  2552. X    (void) signal(SIGBUS, finish);
  2553. X    (void) signal(SIGSEGV, finish);
  2554. X    (void) signal(SIGPIPE, finish);
  2555. X    (void) signal(SIGTERM, SIG_IGN);
  2556. X#ifdef TIOCGWINSZ
  2557. X#ifdef SIGWINCH
  2558. X    (void) signal(SIGWINCH, win_reshape);
  2559. X#endif
  2560. X#endif 
  2561. X    /* set things up to update the modeline every UpdFreq seconds */
  2562. X    (void) signal(SIGALRM, updmode);
  2563. X    (void) alarm((unsigned) (60 - (time((time_t *) 0) % 60)));
  2564. X#endif /* UNIX */
  2565. X
  2566. X    ResetTerm();
  2567. X    cl_scr(1);
  2568. X    flusho();
  2569. X    RedrawDisplay();    /* start the redisplay process. */
  2570. X    DoKeys(0);
  2571. X    finish(0);
  2572. X}
  2573. X
  2574. X#ifdef MSDOS
  2575. X
  2576. X#include <dos.h>
  2577. X
  2578. static    char break_state;
  2579. X
  2580. X/* set the break state to off */
  2581. private void
  2582. break_off()
  2583. X{
  2584. X    union REGS regs;
  2585. X
  2586. X    regs.h.ah = 0x33;        /* break status */
  2587. X    regs.h.al = 0x00;        /* request current state */
  2588. X    intdos(®s, ®s);
  2589. X    break_state = regs.h.dl;
  2590. X    bdos(0x33, 0, 1);    /* turn off break */
  2591. X}
  2592. X
  2593. X/* reset the break state */
  2594. private void
  2595. break_rst()
  2596. X{
  2597. X    bdos(0x33, break_state, 1);
  2598. X}
  2599. X#endif
  2600. END_OF_FILE
  2601. if test 25416 -ne `wc -c <'./jove.c'`; then
  2602.     echo shar: \"'./jove.c'\" unpacked with wrong size!
  2603. fi
  2604. # end of './jove.c'
  2605. fi
  2606. echo shar: End of archive 11 \(of 21\).
  2607. cp /dev/null ark11isdone
  2608. MISSING=""
  2609. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ; do
  2610.     if test ! -f ark${I}isdone ; then
  2611.     MISSING="${MISSING} ${I}"
  2612.     fi
  2613. done
  2614. if test "${MISSING}" = "" ; then
  2615.     echo You have unpacked all 21 archives.
  2616.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2617. else
  2618.     echo You still need to unpack the following archives:
  2619.     echo "        " ${MISSING}
  2620. fi
  2621. ##  End of shell archive.
  2622. exit 0
  2623.